iT邦幫忙

2021 iThome 鐵人賽

DAY 6
1
Software Development

系統與服務雜談系列 第 6

awk-2 Regex搭配淺談

  • 分享至 

  • xImage
  •  

awk回顧
awk - 簡介 Linux 製表好工具

複習一下awk格式
awk [options] 'command' file(s)
這裡command也有自己的格式pattern {awk操作命令}
patter 可以是Regex也可以是邏輯判斷式

上一篇有稍微用到UID>100這邏輯判斷式;
所以也有常見的==!=>< 等等的邏輯判斷符號.

繼續玩, 接著著重在Regex邏輯判斷上
~表示匹配後面的Regex
!~表示不匹配後面的Regex

找出所有UserName開頭是r的

透過~/RegexPattern/

awk -F ':' '$1~/^r.*/{print $1}' /etc/passwd 
# ^是Regex的符號, 用來表示下一個符號一定是搜尋對象的開頭
# .代表任意符號
# *則代表前一個符號可以出現任意次數

https://ithelp.ithome.com.tw/upload/images/20210910/201049308zuWnJDWIr.png

找出所有UserName開頭不是r的

透過!~/RegexPattern/

awk -F ':' '$1!~/^r.*/{print $1}' /etc/passwd 

https://ithelp.ithome.com.tw/upload/images/20210911/20104930uOtGyCOQfh.png

找出所有UID剛好是100的

透過$3==100做pattern; {print $1,$3}是awk操作命令

awk -F ':' '$3==100{print $1,$3}' /etc/passwd

https://ithelp.ithome.com.tw/upload/images/20210911/20104930tRxFRhffq7.png

awk command 擴充模式

awk [options] 'command' file(s)
command可以有BEGINEND; 分別在pattern {awk commands}的之前與之後套用的,
BEGIN會在讀取任何輸入行資料之前執行, 哪怕pattern沒中半個
END在awk退出前執行

製作表格,顯示/etc/passwd每行的行號, 字段數量, 用戶名稱

awk -F ':' 'BEGIN{print "Ln WordCnt User"}{print NR, NF, $1}END{print"----"FILENAME"----"}' /etc/passw

https://ithelp.ithome.com.tw/upload/images/20210911/20104930WjUyq3xXN3.png
結果有出來, 但格式不如預期
這次不自己用空格做編排, 改用\t水平製表符號(tab)

awk -F ':' 'BEGIN{print "Ln \tWordCnt \tUser"}{print NR "\t" NF "\t" $1}END{print"----"FILENAME"----"}' /etc/passwd

https://ithelp.ithome.com.tw/upload/images/20210911/2010493020zD59uCjj.png
是不是整整齊齊的了

透過BEGIN來設定字串分隔符號
之前都是透過option-F
現在也能透過BEGIN加上FS欄位分隔符號做設定
剛剛的例子改成

awk 'BEGIN{FS=":"; print "Ln \tWordCnt \tUser"}{print NR "\t" NF "\t" $1}END{print"----"FILENAME"----"}' /etc/passwd

能達成跟上圖一樣的字串分隔效果與顯示結果

輸出也不只是能有空格或tab
能搭配OFS輸出欄位分隔符號, 來做設定

cat grepText.txt; \
awk 'BEGIN{OFS="-"}{print $1,$2,$3}' grepText.txt
love loove live l0ve lOve l@ve lovelove

https://ithelp.ithome.com.tw/upload/images/20210911/20104930oLAkwcYtvi.png
可以看到本來輸出應該是空格的, 但透過OFS改成-做拼接

玩個無聊的功能
/etc/passswd的UserName我不想給人看到, 做個遮罩

awk 'BEGIN{FS=":"; print "Ln\tWordCnt\tUId\tUser"}{$3="xxxx"; print NR "\t" NF "\t" $3"\t"$1}END{print"----"FILENAME"----"}' /etc/passwd

https://ithelp.ithome.com.tw/upload/images/20210911/20104930P8wm9kmKXu.png
$3="xxxx"也能直接在awk操作命令中, 對某一個字段做值的賦予
如果有多個command, 要用;做區隔


上一篇
awk - 簡介 Linux 製表好工具
下一篇
awk-3 運算符與函數
系列文
系統與服務雜談33
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言